/****************************************************************************
*					Feature
*
*	Description:	Common ancestor for feature classes
*
****************************************************************************/

#ifndef _Feature_H
#define _Feature_H

#include <vector>
#include <string>

class Feature {
  private:

  protected:

  public:
	  // Standard constructor - empty one
	Feature(void) {}
      
	  // Standard destructor - empty one
    virtual ~Feature() {}

      // Calculating feature value given a set of all possible variables and id of variables in this set that are used in the feature
    virtual float calculate (const std::vector<unsigned int>& varIDs, const std::vector <unsigned int>& vars) const = 0;
	  // calculates feature value given a set of variables that are used in the feature
	virtual float calculate (const std::vector <unsigned int>& vars) const = 0;
	
	 // Removes all elements in internal variables
	virtual void clear (void) = 0;

      // Sets values for which a feature should return 1 (if applicable) 
	virtual int setDesiredValues (const std::vector <unsigned int>& desiredValues) = 0;

	  // Returns values for which a feature gives 1 (if applicable) 
	virtual int getDesiredValues (std::vector <unsigned int>& desiredValues) const = 0;

	  // Returns ID of a particular type of features
	virtual int getObjectID (void) const = 0;

	  // Returns string Name of a particular type of features
	virtual int getObjectName (std::string &name) const = 0;

	  // Operator for checking whether two featres are the same
	virtual bool operator==(Feature& second) const = 0;
	
}; // end of class Feature

#endif // _Feature_H
